package com.xzzz.irda.auth.server.authentication;

import com.xzzz.irda.auth.core.authorization.Authorization;
import com.xzzz.irda.auth.server.pojo.LoginMetadata;
import com.xzzz.irda.auth.server.service.UserDetail;


/**
 * 授权的处理方法接口
 *
 * @author wangyf
 * 
 */
public interface AuthenticationManager {
    /**
     * 返回实现类处理的授权类型
     * @return 返回实现类处理的授权类型
     */
    String getGrantType();

    /**
     * 构造授权
     * @param authorization 授权对象
     * @param loginMetadata 请求参数
     * @return 授权主体
     */
    Authorization build(Authorization authorization, LoginMetadata loginMetadata);

    /**
     * 授权对象的业务数据补充
     * @param authorization 授权对象
     * @param loginMetadata 请求参数
     * @return 授权主体
     */
    Authorization authorizationBeforeProcess(Authorization authorization, LoginMetadata loginMetadata);

    /**
     * 查询用户信息
     * @param authorization 授权主体
     * @param loginMetadata 登录请求参数
     * @return 授权主体
     */
    UserDetail findUser(Authorization authorization, LoginMetadata loginMetadata);

    /**
     * 授权对象后处理
     *
     * @param authorization 授权主体
     * @param loginMetadata 登录请求参数
     * @return 授权主体
     */
    Authorization authorizationAfterProcess(Authorization authorization, LoginMetadata loginMetadata);

    /**
     * 保存授权信息
     * @param authorization 授权主体
     */
    void saveAuthorization(Authorization authorization);

    /**
     * 删除授权信息
     * @param authorization 授权主体
     */
    void removeAuthorization (Authorization authorization);

    /**
     * 删除授权信息
     * @param key 授权主体的key
     */
    void removeAuthorization (String key);

    /**
     * 获取授权信息
     * @param authorization 授权主体
     * @return 授权主体
     */
    Authorization getAuthorization (Authorization authorization);

    /**
     * 获取授权信息
     * @param token 授权主体的 token
     * @return 授权主体
     */
    Authorization getAuthorization (String token);

    /**
     * 刷新授权信息
     * @param token token
     */
    void refreshAuthorization(String token);
}
